library("CDR")
library("tidyverse")
ggplot(data = accidentes2020_data,
aes(x = coordenada_x_utm, y = coordenada_y_utm)) +
geom_point() +
coord_fixed()¿Qué tipo de accidentes de tráfico hubo en Madrid en el 2020?
0.1
Los datos que se utilizan en esta historia están disponibles en el paquete CDR que puede instalarse con el siguiente comando:
install.packages("remotes")
remotes::install_github("cdr-book/CDR")Accidentes de tráfico en la Ciudad de Madrid registrados por Policía Municipal con víctimas y/o daños al patrimonio en el 2020. Los datos se han descargado del Portal de datos abiertos del Ayuntamiento de Madrid.)
1 Importanica del contexto.
Exercise 1 ¿Dónde se han producido los accidentes de tráfico en Madrid en el 2020?
No tenemos información, solo unos datos represenados en un gráfico.
2 Elección de un gráfico efectivo
library("sf")
accidentes2020_sf <- st_as_sf(accidentes2020_data,
coords = c("coordenada_x_utm", "coordenada_y_utm"),
crs = 25830 # proyección ETRS89/ UTM zone 30N. Área de uso: Europa
)
library("mapSpain")
madrid <- esp_get_munic(munic = "^Madrid$") |>
st_transform(25830)
# descara imagen de un de mapa estático de las carreteas de Madrid
tile <- esp_getTiles(madrid, "IDErioja", zoommin = 2)
ggplot() +
tidyterra::geom_spatraster_rgb(data = tile) +
geom_sf(data = accidentes2020_sf,
col = "blue", size = 0.1, alpha = 0.3) +
coord_sf(expand = FALSE)3 El desorden es tu enemigo.
Exercise 2 ¿Cuándo se han producido los accidentes?
ggplot(data = accidentes2020_data,
aes(x = fecha, y = hora)) +
geom_point() +
theme_minimal()4 agrupar por hora y día de la semana para ver si hay un patrón ??
library(data.table)
# Convertir la columna 'fecha' a formato Date
accidentes2020_data[, fecha := as.Date(fecha, format = "%d/%m/%Y")]Exercise 3 ¿De qué tipo son?
accidentes2020_data <- accidentes2020_data |>
mutate_if(is.character, as.factor)
accidentes2020_data |>
count(tipo_accidente) |>
mutate(porcentaje = 100 * n / sum(n)) tipo_accidente n porcentaje
<fctr> <int> <num>
1: Alcance 7294 22.4936010
2: Atropello a animal 75 0.2312887
3: Atropello a persona 2127 6.5593487
4: Caída 2118 6.5315940
5: Choque contra obstáculo fijo 4667 14.3923274
6: Colisión frontal 899 2.7723810
7: Colisión fronto-lateral 8081 24.9205909
8: Colisión lateral 4386 13.5257656
9: Colisión múltiple 2231 6.8800691
10: Despeñamiento 2 0.0061677
11: Otro 251 0.7740463
12: Solo salida de la vía 151 0.4656613
13: Vuelco 145 0.4471582
Exercise 4 ¿Existe asociación entre el sexo y el tipo de persona (conductor, pasajero, peaton) que sufre el accidente?
library("gplots")
library(RColorBrewer)
# accidentes2020_data_sin_na <- accidentes2020_data |>
# na.omit()
balloonplot(table(accidentes2020_data$sexo , accidentes2020_data$tipo_persona))Exercise 5 ¿Existe asociación entre el sexo y el tipo de accidente?
library("ggmosaic")
accidentes2020_data |>
ggplot() +
geom_mosaic(aes(x = product(tipo_accidente, sexo),
fill=sexo)) niveles <- levels(factor(accidentes2020_data$tipo_accidente))
etiquetas <- set_names(str_wrap(niveles, width = 20),
niveles)
accidentes2020_data |>
ggplot(aes(sexo, fill = estado_meteorológico)) +
facet_wrap(vars(tipo_accidente),
labeller = as_labeller(etiquetas)) +
geom_bar() +
labs(fill = "Estado Meteorológico") +
theme(axis.text.x = element_text(angle = 90)) +
theme_minimal()5 Centra la atención de tu audiencia.
# con la librería leflet podemos crear un mapa interactivo
library("leaflet")
library("sf")
utm_crs <- "+proj=utm +zone=30 +datum=WGS84 +units=m +no_defs"
accidentes_sf <- st_as_sf(accidentes2020_data,
coords = c("coordenada_x_utm", "coordenada_y_utm"), crs = utm_crs)
accidentes_sf <- st_transform(accidentes_sf, crs = 4326)
accidentes2020_data$longitude <- st_coordinates(accidentes_sf)[, 1]
accidentes2020_data$latitude <- st_coordinates(accidentes_sf)[, 2]
leaflet(data = accidentes2020_data) %>%
addTiles() %>%
addCircleMarkers(lng = ~longitude, lat = ~latitude,
radius = 2, color = "red", opacity = 0.5) %>%
addProviderTiles(providers$Esri.WorldImagery)library("leaflet")
library("sf")
accidentes2020_sf <- st_transform(accidentes2020_sf, crs = 4326)
accidentes2020_data$longitude <- st_coordinates(accidentes2020_sf)[, 1]
accidentes2020_data$latitude <- st_coordinates(accidentes2020_sf)[, 2]
leaflet(data = accidentes2020_data) %>%
addTiles() %>%
addCircleMarkers(lng = ~longitude, lat = ~latitude,
radius = 1, color = "red", opacity = 0.5) # addProviderTiles(providers$Esri.WorldImagery)6 Piensa como un diseñador.
leaflet(data = accidentes2020_data) %>%
addTiles() %>%
addCircleMarkers(lng = ~longitude, lat = ~latitude,
radius = 2, color = "red", opacity = 0.5, clusterOptions = markerClusterOptions())# ahora haz un mapa de calor
library("leaflet.extras")
leaflet(data = accidentes2020_data) %>%
addTiles() %>%
addHeatmap(lng = ~longitude, lat = ~latitude, blur = 20, max = 0.05)Exercise 6 ¿Dónde se registraron los accidentes el día de la declaración del Estado de Alarma en Madrid?
library(data.table)
# Convertir la columna 'fecha' a formato Date
accidentes2020_data[, fecha := as.Date(fecha, format = "%d/%m/%Y")]
# Definir el rango de fechas del estado de alarma
fecha_inicio <- as.Date("2020-03-14")
fecha_fin <- as.Date("2020-03-14")
# Filtrar el dataset por el rango de fechas
estado_alarma_data <- accidentes2020_data[fecha >= fecha_inicio & fecha <= fecha_fin]
# Crear un mapa con los accidentes
leaflet(data = estado_alarma_data) %>%
addTiles() %>%
addCircleMarkers(lng = ~longitude, lat = ~latitude,
radius = 3, color = "red", opacity = 0.5)